home *** CD-ROM | disk | FTP | other *** search
/ Atari Mega Archive 1 / Atari Mega Archive - Volume 1.iso / network / midi / midinet.arc / ANETMIDI.MOD < prev    next >
Text File  |  1987-03-08  |  32KB  |  905 lines

  1. MODULE NETWORK ; (* by fred brooks PD software *)
  2.  
  3. (* --------------------------------------------------------------------------
  4.  
  5.                NETWORK : MIDI MULTI CPU NETWORK FOR TDI Modula-2/ST
  6.  
  7.    --------------------------------------------------------------------------*)
  8.  
  9. (*$T- *)  (*$S- *)
  10.  
  11.  
  12. FROM SYSTEM IMPORT ADDRESS, ADR, SETREG, CODE, REGISTER ,BYTE ,TSIZE,SIZE;
  13. FROM GEMX   IMPORT BasePageAddress, BasePageType ;
  14. FROM BIOS   IMPORT BPB ,BConStat ,BConIn, BCosStat, BConOut, Device,
  15.                    MediaChange,MCState,GetBPB,RWAbs,RW,DriveSet,DriveMap;
  16. FROM XBIOS  IMPORT SuperExec,SerialDevice,IORec,IORECPTR,IOREC,VSync;
  17. FROM GEMDOS IMPORT TermRes,Open,Close ;
  18. IMPORT             GEMDOS;
  19. FROM ASCII  IMPORT SYN,STX,SOH,BEL;
  20.  
  21. CONST
  22.   MaxSeq          = 1;
  23.   recsize         = 511;
  24.   MAGIC           = 3141592653;
  25.   USERS           = 16;
  26.   retry           = 10;
  27.   debug           = FALSE;
  28.   trace           = FALSE;
  29.  
  30.   (* Because we dont know what registers the BIOS is using we must use
  31.      the following opcodes to save the registers *)
  32.   MOVEMDEC = 48E7H ;    (* 68000 opcode for MOVEM <regs>,-(A7) *)
  33.   MOVEMINC = 4CDFH ;    (* 68000 opcode for MOVEM (A7)+,<regs> *)
  34.   SAVEREGS = 07FFCH ;   (* Registers D1..A5 for DEC *)
  35.   RESTREGS = 03FFEH ;   (* Registers D1..A5 for INC *)
  36.   RTS = 04E75H ;        (* 68000 return from subroutine opcode *)
  37.  
  38. TYPE
  39.   (* Procedure types to mimic correct sequence for "C" BIOS routines *)
  40.  
  41.   CBPBProc     = PROCEDURE ( CARDINAL ) ;
  42.   CMediaChProc = PROCEDURE ( CARDINAL ) ;
  43.   CRWAbsProc   = PROCEDURE ( CARDINAL, CARDINAL, CARDINAL, ADDRESS, CARDINAL );
  44.   midibuffer  = ARRAY [0..2000] OF CARDINAL;
  45.   SequenceNr   = [0..MaxSeq];
  46.   message      = ARRAY [0..recsize] OF BYTE;
  47.   message1     = ARRAY [0..17] OF BYTE;
  48.   FrameKind    = (ack,data,resetreq,resetconf,diag);
  49.   DataKind     = (rdmediareq,rdmediaconf,rdbpbreq,rdbpbconf,
  50.                  rdrwabsreq,rdrwabsconf);
  51.   evtype       = (framearrival,cksumerr,timeout,hostready,reset,nothing);
  52.  
  53.   frame        = RECORD
  54.                  syn    :       CHAR; (* these are sync chars *)
  55.                  stx    :       CHAR; (* for the frames       *)
  56.                  kind   :       FrameKind;
  57.                  seq    :       SequenceNr;
  58.                  ack    :       SequenceNr;
  59.                  cmd    :       DataKind;
  60.                  rw     :       CARDINAL; (* read or write data *)
  61.                  recno  :       CARDINAL; (* sector for data*)
  62.                  d0     :       LONGCARD; (* data return variable *)
  63.                  info   :       message;
  64.                  user   :       CARDINAL;
  65.            remoteuser   :       CARDINAL;
  66.                  cksum  :       CARDINAL;
  67.                END;
  68.  
  69.   framecptr    = POINTER TO framecmd;
  70.   framecmd     = RECORD
  71.                  syn    :       CHAR; (* these are sync chars *)
  72.                  stx    :       CHAR; (* for the frames       *)
  73.                  kind   :       FrameKind;
  74.                  seq    :       SequenceNr;
  75.                  ack    :       SequenceNr;
  76.                  cmd    :       DataKind;
  77.                  rw     :       CARDINAL; (* read or write data *)
  78.                  recno  :       CARDINAL; (* sector for data*)
  79.                  d0     :       LONGCARD; (* data return variable *)
  80.                  info   :       message1;
  81.                  user   :       CARDINAL;
  82.            remoteuser   :       CARDINAL;
  83.                  cksum  :       CARDINAL;
  84.                END;
  85.  
  86.   control     = RECORD
  87.                  magic          :       LONGCARD;
  88.                  USER           :       CARDINAL;
  89.                  REMOTEUSER     :       CARDINAL;
  90.                  reset          :       BOOLEAN;
  91.                  networkactive  :       BOOLEAN;
  92.                  remotedrive    :       CARDINAL;
  93.                  drivemap       :       DriveSet;
  94.                 nextframetosend :      ARRAY [0..15] OF SequenceNr;
  95.                 frameexpected   :      ARRAY [0..15] OF SequenceNr;
  96.                 sendreset       :      BOOLEAN;
  97.                END;
  98.  
  99.   consave     = RECORD
  100.                  magic          :       LONGCARD;
  101.                  USER           :       CARDINAL;
  102.                  REMOTEUSER     :       CARDINAL;
  103.                  reset          :       BOOLEAN;
  104.                  networkactive  :       BOOLEAN;
  105.                 END;
  106.  
  107.   vblqueueptr   =       POINTER TO ADDRESS;
  108.   frameptr      =       POINTER TO ARRAY [0..1024] OF BYTE;
  109.  
  110. VAR
  111.  
  112.  
  113.   (* BIOS variables : These can only be accessed with the 68000 in supervisor
  114.      mode. The Modula-2 language allows you to fix the location of variables *)
  115.  
  116.   HDBPB     [0472H] : ADDRESS ;       (* hard disk get Bios Parameter Block *)
  117.   HDRWAbs   [0476H] : ADDRESS ;       (* hard disk read/write abs   *)
  118.   HDMediaCh [047EH] : ADDRESS ;       (* hard disk media change     *)
  119.   DriveBits [04C2H] : SET OF [0..31]; (* disk drives present map    *)
  120.   Cptr      [0210H] : ADDRESS;        (* control record pointer     *)
  121.   Dptr      [0214H] : DriveSet;       (* save original drive map    *)
  122.   Mptr      [0218H] : LONGCARD;
  123.   charcount,framesize,cksum,recframesize,sndframesize,
  124.   SIZEframe,SIZEframecmd                                : CARDINAL;
  125.   vblqueue          : vblqueueptr;    (* set to vbl routines vector *)
  126.   vblptr            : vblqueueptr;
  127.  
  128.   networkconnect          :   BOOLEAN; (* DCD = 1 TRUE  *)
  129.   gotframe                :   BOOLEAN;
  130.   framebufferfull         :   BOOLEAN;
  131.   cleartosend             :   BOOLEAN;
  132.   readytosend             :   BOOLEAN;
  133.   requesttosend           :   BOOLEAN;
  134.   framewaiting            :   BOOLEAN;
  135.   timer,OK                :   BOOLEAN;
  136.   gotmediach              :   ARRAY [0..5] OF BOOLEAN;
  137.   gotbpb                  :   ARRAY [0..5] OF BOOLEAN;
  138.   vblactive               :   BOOLEAN;
  139.   networkerror            :   BOOLEAN;
  140.   shortframe              :   BOOLEAN;
  141.  
  142.   sframe,rframe,SFRAME,RFRAME,
  143.   nframe1,nframe2                  :   frame;
  144.   rframeptr,sframeptr,
  145.   bpbptr,nbpbptr                   :   frameptr;
  146.   framecmdptr,framecmdptr1         :   framecptr;
  147.   event                            :   evtype;
  148.   C                                :   control;
  149.   recchar,timestart,timefortimeout,timeouttime :   LONGCARD;
  150.   timestart1,timefortimeout1,timeouttime1      :   LONGCARD;
  151.   i,i1,i2,i3,mediacount,handle                 :   INTEGER;
  152.   wsector,drvnr,DriveA,DriveF,devicestart,d,R,
  153.   REMOTEUSER,receivedfromuser                  :   CARDINAL;
  154.   rbuffer                                      :   midibuffer;
  155.   rbptr                                        :   IORECPTR;
  156.   numBytes,sec,min,hour,time,count             :   LONGCARD ;
  157.   status                                       :   LONGINT ;
  158.  
  159.   (* The following are saved copies of the BIOS variables so that the real
  160.      hard disk routines can be called if a hard disk access is requested. *)
  161.  
  162.   SaveHDBPB      : CBPBProc ;     (* hard disk get Bios Parameter Block *)
  163.   SaveHDRWAbs    : CRWAbsProc ;   (* hard disk read/write abs *)
  164.   SaveHDMediaCh  : CMediaChProc ; (* hard disk media change *)
  165.  
  166.   (* NETWORK control *)
  167.  
  168.   NetworkBPB  : ARRAY [0..5] OF BPB ; (* BIOS Parameter block for NETWORK *)
  169.  
  170. PROCEDURE MoveMemory ( From, To : ADDRESS ; Bytes : LONGCARD ) ;
  171. (* This routine shows how time critical portions of code can be optimised to
  172.    run faster. It relys on the code generation rules of the compiler which 
  173.    can be checked by dis-assembling the link file with DecLnk.*)
  174.  
  175. CONST
  176.   MOVEB = 12D8H ;       (*      MOVE.B  (A0)+,(A1)+     *)
  177.   MOVEL = 22D8H ;       (*      MOVE.L  (A0)+,(A1)+     *)
  178.   A0    = 0+8 ;         (* register A0 *)
  179.   A1    = 1+8 ;         (* register A1 *)
  180.  
  181. BEGIN
  182.   SETREG(A0,From) ;             (* load From pointer into A0 *)
  183.   SETREG(A1,To) ;               (* load To pointer into A1 *)
  184.   
  185.   IF ( ODD(From) OR ODD(To) ) THEN      (* must do bytes *)
  186.     WHILE ( Bytes <> 0 ) DO
  187.       CODE(MOVEB) ;
  188.       DEC(Bytes) ;
  189.     END ;
  190.   ELSE (* even addresses so can do long moves *)
  191.     WHILE ( Bytes > 3 ) DO
  192.       CO